外部 Odoo API 可以分為 XML-RPC 和 JSON-RPC,我們先來演示 XML-RPC,這是為了之後的 Client App 做鋪墊,執行環境及語言是 Python Interpreter,很便捷的方式。
這邊簡單講一下 RPC (Remote Procedure Call),可以理解成,本機端機器傳送一段指令給遠端伺服器,使其在遠端伺服器上執行某些指令,並將結果回傳給本機端機器,就像是老闆要我們社畜做事,結果要記得回報給老闆,哈哈。
在 Odoo XML-RPC 中,不用登入,也能連結到 xmlrpc/2/common
端點,調用 Odoo 伺服器公開的方法,像是確認 Odoo 伺服器的 Odoo 版本,和確認登入細節。
version()
使用 xmlrpc/2/common
端點的方法 version()
,不需要任何參數,並會回傳 Dict
。
>>> from xmlrpc import client
>>> server = "http://localhost:8069"
>>> common = client.ServerProxy("%s/xmlrpc/2/common" %server)
>>> common.version()
{'server_version': '15.0', 'server_version_info': [15, 0, 0, 'final', 0, ''], 'server_serie': '15.0', 'protocol_version': 1}
首先建立連線,連線到 xmlrpc/2/common
,接著可以直接針對物件調用 version()
了。
別忘了,先啟動伺服器歐 ;-) --- 文西
authenticate(...)
在後續的操作中,會大量使用到透過 authenticate(...)
方法得到的 User ID
,像在伺服器端搜尋或讀取 records。
authenticate(...)
的四個參數,分別是 Database Name
, DB Username
, DB Passwords
和 User Agent
,並且會回傳 User ID
(uid
),我們這邊只用前三個參數,
>>> db, username, password = "library", "YOUR_DB_USERNAME", "YOUR_DB_PASSWORDS"
>>> uid = common.authenticate(db,username,password, {})
>>> print(uid)
2
如果你是照著之前的步驟的話,帳密預設是
admin
(小聲) --- 文西
execute_kw(...)
最直接存取 Odoo models 及 methods 的方法是使用 xmlrpc/2/object
的端點,當然,你是需要帳號密碼的,有了這個方法你就能調用 Odoo 裡常見的方法:search()
, search_count()
, read()
, create()
, write()
, unlink()
...。
我們來試試看搜尋,登入帳號是 admin
的使用者有幾個,以及他的名子和公司。
search_count
>>> api = client.ServerProxy("%s/xmlrpc/2/object" %server)
>>> domain = [("login", "=", "admin")]
>>> api.execute_kw(db, uid, password, "res.users", "search_count", [domain])
3
這邊的 domain
也就是我們要搜尋的條件,整個方法特別要注意第四個參數,目標是哪個 models,接著是使用哪一個方法,最後也就是方法的參數。
search_read
>>> api = client.ServerProxy("%s/xmlrpc/2/object" %server)
>>> domain = [("login", "=", "admin")]
>>> api.execute_kw(db, uid, password, "res.users", "search_read", [], {"domain":domain, "fields":["name", "company_id"]})
[{'id': 2, 'name': 'Mitchell Admin', 'company_id': [1, 'YourCompany']}]
這邊我們用一樣的搜尋條件,但搜尋出來的結果我只對名子和公司有興趣。
幾乎一樣,所以使用 Odoo XML-RPC 的方法一定要去查,這些方法要怎麼使用,在把他丟到 execute_kw()
就行啦!
當然,你會發現,我用兩種函式調用方法:positional (或是說 list unpacking) 和 keywords 的方式 ;-)
第22天了,目前進度正常,還來得及在最後補上調整 Backend 和 Frontend View,繼續加油!
Ref:https://www.odoo.com/documentation/15.0/developer/reference/external_api.html